Android — Activity 启动模式

前言

无意中看到一篇博客讲到 Activity 的启动模式,说实话,我之前还真的没了解这个知识点。之前讲的是 Activity 的生命周期、任务栈已经数据传递,对于启动模式还是遗漏了,今天就借他人博客来好好掌握这个知识点,原文链接:http://www.jianshu.com/p/1d5e7fc8cb2b

产生原由

系统多次启动同一个 Activity 就会重复创建多个实例。为了优化这个问题,Android 提供了四种启动模式。分别为 standard 标准模式、singleTop 单一顶部模式、singleTask 单一任务模式和 singleInstance 单一实例模式。

standard 标准模式

开启这个 Activity ,系统就会 new 一个新的 Activity ,这个 Activity 就会出现在任务栈的顶部。

singleTop 单一顶部模式

即在顶部只有一个,如果开启的 Activity 已经存在一个实例在任务栈的顶部,在去开启这个 Activity ,系统就不会创建新的 Activity 实例了,而是复用已经存在的这个 Activity 。

应用场景:搜索

1
2
3
4
5
6
7
8
9
10
11
> 比如我们在搜索框中输入想要搜索的内容,点击搜索进入SearchResultActivity(搜索结果页面)查看搜索的结果(一般我们也会在搜索结果页提供搜索框,这样用户无需点击返回键回到上一个页面,再在搜索框中输入搜索内容点击搜索),如果此时用户还想搜点别的东西,就可以在当前的搜索结果页面SearchResultActivity的搜索框中,输入搜索内容继续搜索。
>
> 如果把SearchResultActivity的启动模式设置为standard标准模式,比如我们连着搜了10个内容,那么就会启动10个不同的SearchResultActivity,但是这些SearchResultActivity的功能完全一样,完全没有必要创建这么多,要按10次back键才能返回首页。
>
> 所以,我们就要使用到singleTop,把SearchResultActivity的启动模式设置为singleTop,这样用户在SearchResultActivity页面继续搜索的时候,只需要把用户搜索的内容放在Intent里面,然后启动SearchResultActivity,这时系统并不会创建新的SearchResultActivity,而是回调当前任务栈栈顶的SearchResultActivity的onNewIntent()方法来接收带有用户搜索内容信息的Intent,我们拿到用户搜索内容后,调搜索接口,并根据接口返回内容重新刷新布局即可。
>
> 作者:跳动的松鼠
> 链接:http://www.jianshu.com/p/1d5e7fc8cb2b
> 來源:简书
> 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
>

singleTask 单一任务模式

如果任务栈中已经存在 Activity 的实例,就不会创建,而是直接复用这个已经存在的 Activity ,并且把这个 Activity 上面的其他 Activity 全部清空。

目的:Activity 开销大,适合做主页面。

singleInstance 单一实例模式

这种启动模式和 singleTask 几乎一样,它也只允许系统中存在一个目标的 Activity ,包括上面所说的 SingleTask 的一些特性 singleInstance 都有。唯一不同的是,持有目标 Activity 的任务栈中只能有一个目标 Activity 。如果在这种启动模式在去启动其他 Activity ,系统会创建新的任务栈放置当前 Activity 。

怎么启动?

  • 在 AndroidMenifest.xml 中设置属性 android : lanuchMode = “”

  • 通过为 Intent 添加标识

    1
    2
    3
    Intent intent = new Intent(ToolsTrans.this, MainActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    startActivity(intent);

    不过通过 addFlags() 方法只能设置 singleTask 和 singleTop 两种模式,分别对应 Intent.FLAG_ACTIVITY_NEW_TASK 和 Intent.FLAG_ACTIVITY_SINGLE_TOP。

引自

http://www.jianshu.com/p/1d5e7fc8cb2b
http://www.jianshu.com/p/4c8d6e2117ac

我们一直都向往,面朝大海,春暖花开。 但是几人能做到,心中有爱,四季不败?